package com.maxjay.system.dao;

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;

@SuppressWarnings({"rawtypes"})
public interface BaseDao {
	/**
	 * 保存
	 * 
	 * @param obj
	 * @author:Administrator
	 */
	public void save(Object entity);
	
	/**
	 * 使用这种方式可以保证事务依然是由spring来管理的
	 * 
	 * @param objList
	 */
	public void batchSave(final List objList);

	/**
	 * 更新
	 * 
	 * @param obj
	 * @author:Administrator
	 */
	public void update(Object entity);
	
	public void saveOrUpdate(Object entity);

	/**
	 * 根据hql查找
	 * 
	 * @param hql
	 * @param values
	 * @return
	 * @author:Administrator
	 */
	public List findByHql(String hql, Object[] values);

	/**
	 * 根据hql查找并可以指定是否需要使用Query Cache缓存
	 * 
	 * @注意 缓存使用要注意，会出现缓存数据和数据库同步的问题。缓存适用于数据更新很少的情况，若频繁更新则不要使用缓存
	 * 
	 * @param hql
	 *            String
	 * @param args
	 *            Object[]
	 * @param useCache
	 *            boolean
	 * @return List
	 * @author:Administrator
	 */
	public List findByHql(String hql, Object[] args, boolean useCache);
	
	public List findByCriteria(DetachedCriteria dc);

	/**
	 * 利用hibernate中query接口的iterate方法在查询时使用缓存查找（会产生n+1条sql问题）
	 * 
	 * @param hql
	 * @param args
	 * @return
	 * @author:Administrator
	 */
	public Iterator iterateByHql(String hql, Object[] args);

	/**
	 * 根据sql查找
	 * 
	 * @param sql
	 * @param values
	 * @return
	 * @author:Administrator
	 */
	public List findBySql(String sql, Object[] values);

	/**
	 * 删除操作
	 * 
	 * @param obj
	 * @author:Administrator
	 */
	public void delete(Object entity);
	
	/**
	 * 删除操作
	 * 
	 * @param obj
	 * @author:Administrator
	 */
	public void delete(Class objClass, Serializable objId);

	/**
	 * 通过hql语句执行批量更新操作 使用该方法更新可以自动管理hibernate二级缓存
	 * 
	 * @param hql
	 * @param values
	 * @author:Administrator
	 */
	public void bulkUpdate(String hql, Object[] values);
	
	/**
	 * 获取分页的结果
	 * 
	 * @param hql
	 * @param pageStart
	 * @param maxResult
	 * @return
	 */
	public List getPagingObjects(final String hql, final int pageStart, final int maxResult);
	
	/**
	 * 获取分页的结果
	 * 
	 * @param dc
	 * @param pageStart
	 * @param maxResult
	 * @return
	 */
	List getPagingObjects(final DetachedCriteria dc, final int pageStart, final int maxResult);

	/**
	 * 通过sql语句执行更新操作，如果二级缓存中有改对象则要手动清除
	 * 
	 * @param sql
	 * @param values
	 * @author:Administrator
	 */
	public void updateSql(String sql, Object[] values);

	/**
	 * 执行sql
	 * 
	 * @param sql
	 * @author:Administrator
	 */
	// public void executeSql(String sql);
	public Object get(Class clazz, Serializable id);

	public Object load(Class clazz, Serializable id);
}
